package com.example.springboottest.example.atomic;

import com.example.springboottest.example.equals.Stu;
import com.example.springboottest.util.Print;
import com.example.springboottest.util.ThreadUtil;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 使用原子引用类型AtomicReference包装了User对象之后，只能保障 User引用的原子操作，
 * 对被包装的User对象的字段值修改时不能保证原子性，这点要切记。
 * 如果想保证字段级别的原子性，需要用到AtomicIntegerFieldUpdater
 */
public class AtomicStuRefTest {
    public static void main(String[] args) {
        //包装的原子对象
        AtomicReference<Stu> userRef = new AtomicReference<>();
        //待包装的User对象
        Stu user = new Stu("张三", 1);
        //为原子对象设置值
        userRef.set(user);
        Print.tco("userRef is:" + userRef.get());
        //要使用CAS替换的User对象
        Stu updateUser = new Stu("李四", 2);
        //使用CAS替换
        boolean success = userRef.compareAndSet(user, updateUser);
        Print.tco(" cas result is:" + success);
        Print.tco(" after cas,userRef is:" + userRef.get());
    }
}
